home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 6 / CU Amiga Magazine's Super CD-ROM 06 (1996)(EMAP Images)(GB)(Track 1 of 4)[!][issue 1997-01].iso / cucd / prog / gnu-c / src / gcc-2.7.0-amiga / config / arm / lib1funcs.asm < prev    next >
Assembly Source File  |  1995-06-15  |  31KB  |  1,599 lines

  1. @ libgcc1 routines for ARM cpu.
  2. @ Division and remainder, from Appendix E of the Sparc Version 8
  3. @ Architecture Manual, with fixes from Gordon Irlam.
  4. @ Rewritten for the ARM by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
  5.  
  6. /* Copyright (C) 1995 Free Software Foundation, Inc.
  7.  
  8. This file is free software; you can redistribute it and/or modify it
  9. under the terms of the GNU General Public License as published by the
  10. Free Software Foundation; either version 2, or (at your option) any
  11. later version.
  12.  
  13. In addition to the permissions in the GNU General Public License, the
  14. Free Software Foundation gives you unlimited permission to link the
  15. compiled version of this file with other programs, and to distribute
  16. those programs without any restriction coming from the use of this
  17. file.  (The General Public License restrictions do apply in other
  18. respects; for example, they cover modification of the file, and
  19. distribution when not linked into another program.)
  20.  
  21. This file is distributed in the hope that it will be useful, but
  22. WITHOUT ANY WARRANTY; without even the implied warranty of
  23. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  24. General Public License for more details.
  25.  
  26. You should have received a copy of the GNU General Public License
  27. along with this program; see the file COPYING.  If not, write to
  28. the Free Software Foundation, 59 Temple Place - Suite 330,
  29. Boston, MA 02111-1307, USA.  */
  30.  
  31. /* As a special exception, if you link this library with other files,
  32.    some of which are compiled with GCC, to produce an executable,
  33.    this library does not by itself cause the resulting executable
  34.    to be covered by the GNU General Public License.
  35.    This exception does not however invalidate any other reasons why
  36.    the executable file might be covered by the GNU General Public License.  */
  37.  
  38. /*
  39.  * Input: dividend and divisor in r0 and r1 respectively.
  40.  *
  41.  * m4 parameters:
  42.  *  NAME    name of function to generate
  43.  *  OP        OP=div => r0 / r1; OP=mod => r0 % r1
  44.  *  S        S=true => signed; S=false => unsigned
  45.  *
  46.  * Algorithm parameters:
  47.  *  N        how many bits per iteration we try to get (4)
  48.  *  WORDSIZE    total number of bits (32)
  49.  *
  50.  * Derived constants:
  51.  *  TOPBITS    number of bits in the top `decade' of a number
  52.  *
  53.  * Important variables:
  54.  *  Q        the partial quotient under development (initially 0)
  55.  *  R        the remainder so far, initially the dividend
  56.  *  ITER    number of main division loop iterations required;
  57.  *        equal to ceil(log2(quotient) / N).  Note that this
  58.  *        is the log base (2^N) of the quotient.
  59.  *  V        the current comparand, initially divisor*2^(ITER*N-1)
  60.  *
  61.  * Cost:
  62.  *  Current estimate for non-large dividend is
  63.  *    ceil(log2(quotient) / N) * (10 + 7N/2) + C
  64.  *  A large dividend is one greater than 2^(31-TOPBITS) and takes a
  65.  *  different path, as the upper bits of the quotient must be developed
  66.  *  one bit at a time.
  67.  */
  68.  
  69. /*
  70. define(N, `4')dnl
  71. define(WORDSIZE, `32')dnl
  72. define(TOPBITS, eval(WORDSIZE - N*((WORDSIZE-1)/N)))dnl
  73. dnl
  74. define(dividend, `r0')dnl
  75. define(divisor, `r1')dnl
  76. define(Q, `r2')dnl
  77. define(R, `r3')dnl
  78. define(ITER, `ip')dnl
  79. define(V, `lr')dnl
  80. dnl
  81. dnl m4 reminder: ifelse(a,b,c,d) => if a is b, then c, else d
  82. define(T, `r4')dnl
  83. define(SC, `r5')dnl
  84. ifelse(S, `true', `define(SIGN, `r6')')dnl
  85. define(REGLIST, `ifelse(S, `true', `{r4, r5, r6,', `{r4, r5,')')dnl
  86. define(ret, `ldmia    sp!, REGLIST pc}')dnl
  87. dnl
  88. dnl This is the recursive definition for developing quotient digits.
  89. dnl
  90. dnl Parameters:
  91. dnl  $1    the current depth, 1 <= $1 <= N
  92. dnl  $2    the current accumulation of quotient bits
  93. dnl  N    max depth
  94. dnl
  95. dnl We add a new bit to $2 and either recurse or insert the bits in
  96. dnl the quotient.  R, Q, and V are inputs and outputs as defined above;
  97. dnl the condition codes are expected to reflect the input R, and are
  98. dnl modified to reflect the output R.
  99. dnl
  100. define(DEVELOP_QUOTIENT_BITS,
  101. `    @ depth $1, accumulated bits $2
  102.     mov    V, V, lsr #1
  103.     blt    L.$1.eval(2^N+$2+999)
  104.     @ remainder is positive
  105.     subs    R, R, V
  106.     ifelse($1, N,
  107.     `    ifelse(eval(2*$2+1<0), `0',
  108.         `add    Q, Q, `#'eval($2*2+1)',
  109.         `sub    Q, Q, `#'eval(-($2*2+1))')
  110.  
  111.         b    9f
  112.     ', `    DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2+1)')')
  113. L.$1.eval(2^N+$2+999):
  114.     @ remainder is negative
  115.     adds    R, R, V
  116.     ifelse($1, N,
  117.     `    ifelse(eval(2*$2-1<0), `0',
  118.         `add    Q, Q, `#'eval($2*2-1)',
  119.         `sub    Q, Q, `#'eval(-($2*2-1))')
  120.         b    9f
  121.  
  122.     ', `    DEVELOP_QUOTIENT_BITS(incr($1), `eval(2*$2-1)')')
  123.     ifelse($1, 1, `9:')')dnl
  124.  
  125. #include "trap.h"
  126.  
  127. ip    .req    r12
  128. sp    .req    r13
  129. lr    .req    r14
  130. pc    .req    r15
  131. .text
  132.     .globl NAME
  133.     .align 0
  134. NAME:
  135.     stmdb    sp!, REGLIST lr}
  136. ifelse(S, `true',
  137. `    @ compute sign of result; if neither is negative, no problem
  138.     eor    SIGN, divisor, dividend    @ compute sign
  139.     cmp    divisor, #0
  140.     rsbmi    divisor, divisor, #0
  141.     beq    Ldiv_zero
  142.     mov    V, divisor
  143.     movs    R, dividend
  144.     rsbmi    R, R, #0    @ make dividend nonnegative
  145. ',
  146. `    @ Ready to divide.  Compute size of quotient; scale comparand.
  147.     movs    V, divisor
  148.     mov    R, dividend
  149.     beq    Ldiv_zero
  150. ')
  151.  
  152.     cmp    R, V            @ if divisor exceeds dividend, done
  153.     mov    Q, #0
  154.     bcc    Lgot_result        @ (and algorithm fails otherwise)
  155.     mov    T, `#'(1 << (WORDSIZE - TOPBITS - 1))
  156.     cmp    R, T
  157.     mov    ITER, #0
  158.     bcc    Lnot_really_big
  159.  
  160.     @ `Here the dividend is >= 2^(31-N) or so.  We must be careful here,
  161.     @ as our usual N-at-a-shot divide step will cause overflow and havoc.
  162.     @ The number of bits in the result here is N*ITER+SC, where SC <= N.
  163.     @ Compute ITER in an unorthodox manner: know we need to shift V into
  164.     @ the top decade: so do not even bother to compare to R.'
  165.         mov    SC, #1
  166.     1:
  167.         cmp    V, T
  168.         bcs    3f
  169.         mov    V, V, lsl `#'N
  170.         add    ITER, ITER, #1
  171.         b    1b
  172.  
  173.     @ Now compute SC.
  174.     2:    adds    V, V, V
  175.         add    SC, SC, #1
  176.         bcc    Lnot_too_big
  177.  
  178.         @ We get here if the divisor overflowed while shifting.
  179.         @ This means that R has the high-order bit set.
  180.         @ Restore V and subtract from R.
  181.         mov    T, T, lsl `#'TOPBITS
  182.         mov    V, V, lsr #1
  183.         add    V, T, V
  184.         sub    SC, SC, #1
  185.         b    Ldo_single_div
  186.  
  187.     Lnot_too_big:
  188.     3:    cmp    V, R
  189.         bcc    2b
  190. @        beq    Ldo_single_div
  191.  
  192.     /-* NB: these are commented out in the V8-Sparc manual as well *-/
  193.     /-* (I do not understand this) *-/
  194.     @ V > R: went too far: back up 1 step
  195.     @    srl    V, 1, V
  196.     @    dec    SC
  197.     @ do single-bit divide steps
  198.     @
  199.     @ We have to be careful here.  We know that R >= V, so we can do the
  200.     @ first divide step without thinking.  BUT, the others are conditional,
  201.     @ and are only done if R >= 0.  Because both R and V may have the high-
  202.     @ order bit set in the first step, just falling into the regular
  203.     @ division loop will mess up the first time around.
  204.     @ So we unroll slightly...
  205.     Ldo_single_div:
  206.         subs    SC, SC, #1
  207.         blt    Lend_regular_divide
  208.         sub    R, R, V
  209.         mov    Q, #1
  210.         b    Lend_single_divloop
  211.     Lsingle_divloop:
  212.         cmp    R, #0
  213.         mov    Q, Q, lsl #1
  214.         mov    V, V, lsr #1
  215.         @ R >= 0
  216.         subpl    R, R, V
  217.         addpl    Q, Q, #1
  218.         @ R < 0
  219.         addmi    R, R, V
  220.         submi    Q, Q, #1
  221.     Lend_single_divloop:
  222.         subs    SC, SC, #1
  223.         bge    Lsingle_divloop
  224.         b    Lend_regular_divide
  225.  
  226. 1:
  227.     add    ITER, ITER, #1
  228. Lnot_really_big:
  229.     mov    V, V, lsl `#'N
  230.     cmp    V, R
  231.     bls    1b
  232.     @
  233.     @    HOW CAN ITER EVER BE -1 HERE ?????
  234.     @
  235.     cmn    ITER, #1
  236.     beq    Lgot_result
  237.  
  238. Ldivloop:
  239.     cmp    R, #0    @ set up for initial iteration
  240.     mov    Q, Q, lsl `#'N
  241.     DEVELOP_QUOTIENT_BITS(1, 0)
  242. Lend_regular_divide:
  243.     subs    ITER, ITER, #1
  244.     bge    Ldivloop
  245.     cmp    R, #0
  246.     @ non-restoring fixup here (one instruction only!)
  247. ifelse(OP, `div',
  248. `    sublt    Q, Q, #1
  249. ', `    addlt    R, divisor, R
  250. ')
  251.  
  252. Lgot_result:
  253. ifelse(S, `true',
  254. `    @ check to see if answer should be < 0
  255.     cmp    SIGN, #0
  256.     ifelse(OP, `div', `rsbmi Q, Q, #0', `rsbmi R, R, #0')
  257. ')
  258.     ifelse(OP, `div', `mov r0, Q', `mov r0, R')
  259.     ret
  260.  
  261. Ldiv_zero:
  262.     @ Divide by zero trap.  If it returns, return 0 (about as
  263.     @ wrong as possible, but that is what SunOS does...).
  264.     bl    ___div0
  265.     mov    r0, #0
  266.     ret
  267. */
  268.  
  269. #ifdef L_udivsi3
  270.  
  271. ip    .req    r12
  272. sp    .req    r13
  273. lr    .req    r14
  274. pc    .req    r15
  275. .text
  276.     .globl ___udivsi3
  277.     .align 0
  278. ___udivsi3:
  279.     stmdb    sp!, {r4, r5, lr}
  280.     @ Ready to divide.  Compute size of quotient; scale comparand.
  281.     movs    lr, r1
  282.     mov    r3, r0
  283.     beq    Ldiv_zero
  284.  
  285.  
  286.     cmp    r3, lr            @ if r1 exceeds r0, done
  287.     mov    r2, #0
  288.     bcc    Lgot_result        @ (and algorithm fails otherwise)
  289.     mov    r4, #(1 << (32 - 4 - 1))
  290.     cmp    r3, r4
  291.     mov    ip, #0
  292.     bcc    Lnot_really_big
  293.  
  294.     @ Here the dividend is >= 2^(31-N) or so.  We must be careful here,
  295.     @ as our usual N-at-a-shot divide step will cause overflow and havoc.
  296.     @ The number of bits in the result here is N*ITER+SC, where SC <= N.
  297.     @ Compute ITER in an unorthodox manner: know we need to shift V into
  298.     @ the top decade: so do not even bother to compare to R.
  299.         mov    r5, #1
  300.     1:
  301.         cmp    lr, r4
  302.         bcs    3f
  303.         mov    lr, lr, lsl #4
  304.         add    ip, ip, #1
  305.         b    1b
  306.  
  307.     @ Now compute r5.
  308.     2:    adds    lr, lr, lr
  309.         add    r5, r5, #1
  310.         bcc    Lnot_too_big
  311.  
  312.         @ We get here if the r1 overflowed while shifting.
  313.         @ This means that r3 has the high-order bit set.
  314.         @ Restore lr and subtract from r3.
  315.         mov    r4, r4, lsl #4
  316.         mov    lr, lr, lsr #1
  317.         add    lr, r4, lr
  318.         sub    r5, r5, #1
  319.         b    Ldo_single_div
  320.  
  321.     Lnot_too_big:
  322.     3:    cmp    lr, r3
  323.         bcc    2b
  324. @        beq    Ldo_single_div
  325.  
  326.     /* NB: these are commented out in the V8-Sparc manual as well */
  327.     /* (I do not understand this) */
  328.     @ lr > r3: went too far: back up 1 step
  329.     @    srl    lr, 1, lr
  330.     @    dec    r5
  331.     @ do single-bit divide steps
  332.     @
  333.     @ We have to be careful here.  We know that r3 >= lr, so we can do the
  334.     @ first divide step without thinking.  BUT, the others are conditional,
  335.     @ and are only done if r3 >= 0.  Because both r3 and lr may have the high-
  336.     @ order bit set in the first step, just falling into the regular
  337.     @ division loop will mess up the first time around.
  338.     @ So we unroll slightly...
  339.     Ldo_single_div:
  340.         subs    r5, r5, #1
  341.         blt    Lend_regular_divide
  342.         sub    r3, r3, lr
  343.         mov    r2, #1
  344.         b    Lend_single_divloop
  345.     Lsingle_divloop:
  346.         cmp    r3, #0
  347.         mov    r2, r2, lsl #1
  348.         mov    lr, lr, lsr #1
  349.         @ r3 >= 0
  350.         subpl    r3, r3, lr
  351.         addpl    r2, r2, #1
  352.         @ r3 < 0
  353.         addmi    r3, r3, lr
  354.         submi    r2, r2, #1
  355.     Lend_single_divloop:
  356.         subs    r5, r5, #1
  357.         bge    Lsingle_divloop
  358.         b    Lend_regular_divide
  359.  
  360. 1:
  361.     add    ip, ip, #1
  362. Lnot_really_big:
  363.     mov    lr, lr, lsl #4
  364.     cmp    lr, r3
  365.     bls    1b
  366.     @
  367.     @    HOW CAN ip EVER BE -1 HERE ?????
  368.     @
  369.     cmn    ip, #1
  370.     beq    Lgot_result
  371.  
  372. Ldivloop:
  373.     cmp    r3, #0    @ set up for initial iteration
  374.     mov    r2, r2, lsl #4
  375.         @ depth 1, accumulated bits 0
  376.     mov    lr, lr, lsr #1
  377.     blt    L.1.1015
  378.     @ remainder is positive
  379.     subs    r3, r3, lr
  380.             @ depth 2, accumulated bits 1
  381.     mov    lr, lr, lsr #1
  382.     blt    L.2.1016
  383.     @ remainder is positive
  384.     subs    r3, r3, lr
  385.             @ depth 3, accumulated bits 3
  386.     mov    lr, lr, lsr #1
  387.     blt    L.3.1018
  388.     @ remainder is positive
  389.     subs    r3, r3, lr
  390.             @ depth 4, accumulated bits 7
  391.     mov    lr, lr, lsr #1
  392.     blt    L.4.1022
  393.     @ remainder is positive
  394.     subs    r3, r3, lr
  395.         add    r2, r2, #15
  396.  
  397.         b    9f
  398.     
  399. L.4.1022:
  400.     @ remainder is negative
  401.     adds    r3, r3, lr
  402.         add    r2, r2, #13
  403.         b    9f
  404.  
  405.     
  406.     
  407. L.3.1018:
  408.     @ remainder is negative
  409.     adds    r3, r3, lr
  410.             @ depth 4, accumulated bits 5
  411.     mov    lr, lr, lsr #1
  412.     blt    L.4.1020
  413.     @ remainder is positive
  414.     subs    r3, r3, lr
  415.         add    r2, r2, #11
  416.  
  417.         b    9f
  418.     
  419. L.4.1020:
  420.     @ remainder is negative
  421.     adds    r3, r3, lr
  422.         add    r2, r2, #9
  423.         b    9f
  424.  
  425.     
  426.     
  427.     
  428. L.2.1016:
  429.     @ remainder is negative
  430.     adds    r3, r3, lr
  431.             @ depth 3, accumulated bits 1
  432.     mov    lr, lr, lsr #1
  433.     blt    L.3.1016
  434.     @ remainder is positive
  435.     subs    r3, r3, lr
  436.             @ depth 4, accumulated bits 3
  437.     mov    lr, lr, lsr #1
  438.     blt    L.4.1018
  439.     @ remainder is positive
  440.     subs    r3, r3, lr
  441.         add    r2, r2, #7
  442.  
  443.         b    9f
  444.     
  445. L.4.1018:
  446.     @ remainder is negative
  447.     adds    r3, r3, lr
  448.         add    r2, r2, #5
  449.         b    9f
  450.  
  451.     
  452.     
  453. L.3.1016:
  454.     @ remainder is negative
  455.     adds    r3, r3, lr
  456.             @ depth 4, accumulated bits 1
  457.     mov    lr, lr, lsr #1
  458.     blt    L.4.1016
  459.     @ remainder is positive
  460.     subs    r3, r3, lr
  461.         add    r2, r2, #3
  462.  
  463.         b    9f
  464.     
  465. L.4.1016:
  466.     @ remainder is negative
  467.     adds    r3, r3, lr
  468.         add    r2, r2, #1
  469.         b    9f
  470.  
  471.     
  472.     
  473.     
  474.     
  475. L.1.1015:
  476.     @ remainder is negative
  477.     adds    r3, r3, lr
  478.             @ depth 2, accumulated bits -1
  479.     mov    lr, lr, lsr #1
  480.     blt    L.2.1014
  481.     @ remainder is positive
  482.     subs    r3, r3, lr
  483.             @ depth 3, accumulated bits -1
  484.     mov    lr, lr, lsr #1
  485.     blt    L.3.1014
  486.     @ remainder is positive
  487.     subs    r3, r3, lr
  488.             @ depth 4, accumulated bits -1
  489.     mov    lr, lr, lsr #1
  490.     blt    L.4.1014
  491.     @ remainder is positive
  492.     subs    r3, r3, lr
  493.         sub    r2, r2, #1
  494.  
  495.         b    9f
  496.     
  497. L.4.1014:
  498.     @ remainder is negative
  499.     adds    r3, r3, lr
  500.         sub    r2, r2, #3
  501.         b    9f
  502.  
  503.     
  504.     
  505. L.3.1014:
  506.     @ remainder is negative
  507.     adds    r3, r3, lr
  508.             @ depth 4, accumulated bits -3
  509.     mov    lr, lr, lsr #1
  510.     blt    L.4.1012
  511.     @ remainder is positive
  512.     subs    r3, r3, lr
  513.         sub    r2, r2, #5
  514.  
  515.         b    9f
  516.     
  517. L.4.1012:
  518.     @ remainder is negative
  519.     adds    r3, r3, lr
  520.         sub    r2, r2, #7
  521.         b    9f
  522.  
  523.     
  524.     
  525.     
  526. L.2.1014:
  527.     @ remainder is negative
  528.     adds    r3, r3, lr
  529.             @ depth 3, accumulated bits -3
  530.     mov    lr, lr, lsr #1
  531.     blt    L.3.1012
  532.     @ remainder is positive
  533.     subs    r3, r3, lr
  534.             @ depth 4, accumulated bits -5
  535.     mov    lr, lr, lsr #1
  536.     blt    L.4.1010
  537.     @ remainder is positive
  538.     subs    r3, r3, lr
  539.         sub    r2, r2, #9
  540.  
  541.         b    9f
  542.     
  543. L.4.1010:
  544.     @ remainder is negative
  545.     adds    r3, r3, lr
  546.         sub    r2, r2, #11
  547.         b    9f
  548.  
  549.     
  550.     
  551. L.3.1012:
  552.     @ remainder is negative
  553.     adds    r3, r3, lr
  554.             @ depth 4, accumulated bits -7
  555.     mov    lr, lr, lsr #1
  556.     blt    L.4.1008
  557.     @ remainder is positive
  558.     subs    r3, r3, lr
  559.         sub    r2, r2, #13
  560.  
  561.         b    9f
  562.     
  563. L.4.1008:
  564.     @ remainder is negative
  565.     adds    r3, r3, lr
  566.         sub    r2, r2, #15
  567.         b    9f
  568.  
  569.     
  570.     
  571.     
  572.     
  573.     9:
  574. Lend_regular_divide:
  575.     subs    ip, ip, #1
  576.     bge    Ldivloop
  577.     cmp    r3, #0
  578.     @ non-restoring fixup here (one instruction only!)
  579.     sublt    r2, r2, #1
  580.  
  581.  
  582. Lgot_result:
  583.  
  584.     mov r0, r2
  585.     ldmia    sp!, {r4, r5, pc}
  586.  
  587. Ldiv_zero:
  588.     @ Divide by zero trap.  If it returns, return 0 (about as
  589.     @ wrong as possible, but that is what SunOS does...).
  590.     bl    ___div0
  591.     mov    r0, #0
  592.     ldmia    sp!, {r4, r5, pc}
  593.  
  594. #endif /* L_udivsi3 */
  595.  
  596. #ifdef L_divsi3
  597.  
  598. ip    .req    r12
  599. sp    .req    r13
  600. lr    .req    r14
  601. pc    .req    r15
  602. .text
  603.     .globl ___divsi3
  604.     .align 0
  605. ___divsi3:
  606.     stmdb    sp!, {r4, r5, r6, lr}
  607.     @ compute sign of result; if neither is negative, no problem
  608.     eor    r6, r1, r0    @ compute sign
  609.     cmp    r1, #0
  610.     rsbmi    r1, r1, #0
  611.     beq    Ldiv_zero
  612.     mov    lr, r1
  613.     movs    r3, r0
  614.     rsbmi    r3, r3, #0    @ make dividend nonnegative
  615.  
  616.  
  617.     cmp    r3, lr            @ if r1 exceeds r0, done
  618.     mov    r2, #0
  619.     bcc    Lgot_result        @ (and algorithm fails otherwise)
  620.     mov    r4, #(1 << (32 - 4 - 1))
  621.     cmp    r3, r4
  622.     mov    ip, #0
  623.     bcc    Lnot_really_big
  624.  
  625.     @ Here the dividend is >= 2^(31-N) or so.  We must be careful here,
  626.     @ as our usual N-at-a-shot divide step will cause overflow and havoc.
  627.     @ The number of bits in the result here is N*ITER+SC, where SC <= N.
  628.     @ Compute ITER in an unorthodox manner: know we need to shift V into
  629.     @ the top decade: so do not even bother to compare to R.
  630.         mov    r5, #1
  631.     1:
  632.         cmp    lr, r4
  633.         bcs    3f
  634.         mov    lr, lr, lsl #4
  635.         add    ip, ip, #1
  636.         b    1b
  637.  
  638.     @ Now compute r5.
  639.     2:    adds    lr, lr, lr
  640.         add    r5, r5, #1
  641.         bcc    Lnot_too_big
  642.  
  643.         @ We get here if the r1 overflowed while shifting.
  644.         @ This means that r3 has the high-order bit set.
  645.         @ Restore lr and subtract from r3.
  646.         mov    r4, r4, lsl #4
  647.         mov    lr, lr, lsr #1
  648.         add    lr, r4, lr
  649.         sub    r5, r5, #1
  650.         b    Ldo_single_div
  651.  
  652.     Lnot_too_big:
  653.     3:    cmp    lr, r3
  654.         bcc    2b
  655. @        beq    Ldo_single_div
  656.  
  657.     /* NB: these are commented out in the V8-Sparc manual as well */
  658.     /* (I do not understand this) */
  659.     @ lr > r3: went too far: back up 1 step
  660.     @    srl    lr, 1, lr
  661.     @    dec    r5
  662.     @ do single-bit divide steps
  663.     @
  664.     @ We have to be careful here.  We know that r3 >= lr, so we can do the
  665.     @ first divide step without thinking.  BUT, the others are conditional,
  666.     @ and are only done if r3 >= 0.  Because both r3 and lr may have the high-
  667.     @ order bit set in the first step, just falling into the regular
  668.     @ division loop will mess up the first time around.
  669.     @ So we unroll slightly...
  670.     Ldo_single_div:
  671.         subs    r5, r5, #1
  672.         blt    Lend_regular_divide
  673.         sub    r3, r3, lr
  674.         mov    r2, #1
  675.         b    Lend_single_divloop
  676.     Lsingle_divloop:
  677.         cmp    r3, #0
  678.         mov    r2, r2, lsl #1
  679.         mov    lr, lr, lsr #1
  680.         @ r3 >= 0
  681.         subpl    r3, r3, lr
  682.         addpl    r2, r2, #1
  683.         @ r3 < 0
  684.         addmi    r3, r3, lr
  685.         submi    r2, r2, #1
  686.     Lend_single_divloop:
  687.         subs    r5, r5, #1
  688.         bge    Lsingle_divloop
  689.         b    Lend_regular_divide
  690.  
  691. 1:
  692.     add    ip, ip, #1
  693. Lnot_really_big:
  694.     mov    lr, lr, lsl #4
  695.     cmp    lr, r3
  696.     bls    1b
  697.     @
  698.     @    HOW CAN ip EVER BE -1 HERE ?????
  699.     @
  700.     cmn    ip, #1
  701.     beq    Lgot_result
  702.  
  703. Ldivloop:
  704.     cmp    r3, #0    @ set up for initial iteration
  705.     mov    r2, r2, lsl #4
  706.         @ depth 1, accumulated bits 0
  707.     mov    lr, lr, lsr #1
  708.     blt    L.1.1015
  709.     @ remainder is positive
  710.     subs    r3, r3, lr
  711.             @ depth 2, accumulated bits 1
  712.     mov    lr, lr, lsr #1
  713.     blt    L.2.1016
  714.     @ remainder is positive
  715.     subs    r3, r3, lr
  716.             @ depth 3, accumulated bits 3
  717.     mov    lr, lr, lsr #1
  718.     blt    L.3.1018
  719.     @ remainder is positive
  720.     subs    r3, r3, lr
  721.             @ depth 4, accumulated bits 7
  722.     mov    lr, lr, lsr #1
  723.     blt    L.4.1022
  724.     @ remainder is positive
  725.     subs    r3, r3, lr
  726.         add    r2, r2, #15
  727.  
  728.         b    9f
  729.     
  730. L.4.1022:
  731.     @ remainder is negative
  732.     adds    r3, r3, lr
  733.         add    r2, r2, #13
  734.         b    9f
  735.  
  736.     
  737.     
  738. L.3.1018:
  739.     @ remainder is negative
  740.     adds    r3, r3, lr
  741.             @ depth 4, accumulated bits 5
  742.     mov    lr, lr, lsr #1
  743.     blt    L.4.1020
  744.     @ remainder is positive
  745.     subs    r3, r3, lr
  746.         add    r2, r2, #11
  747.  
  748.         b    9f
  749.     
  750. L.4.1020:
  751.     @ remainder is negative
  752.     adds    r3, r3, lr
  753.         add    r2, r2, #9
  754.         b    9f
  755.  
  756.     
  757.     
  758.     
  759. L.2.1016:
  760.     @ remainder is negative
  761.     adds    r3, r3, lr
  762.             @ depth 3, accumulated bits 1
  763.     mov    lr, lr, lsr #1
  764.     blt    L.3.1016
  765.     @ remainder is positive
  766.     subs    r3, r3, lr
  767.             @ depth 4, accumulated bits 3
  768.     mov    lr, lr, lsr #1
  769.     blt    L.4.1018
  770.     @ remainder is positive
  771.     subs    r3, r3, lr
  772.         add    r2, r2, #7
  773.  
  774.         b    9f
  775.     
  776. L.4.1018:
  777.     @ remainder is negative
  778.     adds    r3, r3, lr
  779.         add    r2, r2, #5
  780.         b    9f
  781.  
  782.     
  783.     
  784. L.3.1016:
  785.     @ remainder is negative
  786.     adds    r3, r3, lr
  787.             @ depth 4, accumulated bits 1
  788.     mov    lr, lr, lsr #1
  789.     blt    L.4.1016
  790.     @ remainder is positive
  791.     subs    r3, r3, lr
  792.         add    r2, r2, #3
  793.  
  794.         b    9f
  795.     
  796. L.4.1016:
  797.     @ remainder is negative
  798.     adds    r3, r3, lr
  799.         add    r2, r2, #1
  800.         b    9f
  801.  
  802.     
  803.     
  804.     
  805.     
  806. L.1.1015:
  807.     @ remainder is negative
  808.     adds    r3, r3, lr
  809.             @ depth 2, accumulated bits -1
  810.     mov    lr, lr, lsr #1
  811.     blt    L.2.1014
  812.     @ remainder is positive
  813.     subs    r3, r3, lr
  814.             @ depth 3, accumulated bits -1
  815.     mov    lr, lr, lsr #1
  816.     blt    L.3.1014
  817.     @ remainder is positive
  818.     subs    r3, r3, lr
  819.             @ depth 4, accumulated bits -1
  820.     mov    lr, lr, lsr #1
  821.     blt    L.4.1014
  822.     @ remainder is positive
  823.     subs    r3, r3, lr
  824.         sub    r2, r2, #1
  825.  
  826.         b    9f
  827.     
  828. L.4.1014:
  829.     @ remainder is negative
  830.     adds    r3, r3, lr
  831.         sub    r2, r2, #3
  832.         b    9f
  833.  
  834.     
  835.     
  836. L.3.1014:
  837.     @ remainder is negative
  838.     adds    r3, r3, lr
  839.             @ depth 4, accumulated bits -3
  840.     mov    lr, lr, lsr #1
  841.     blt    L.4.1012
  842.     @ remainder is positive
  843.     subs    r3, r3, lr
  844.         sub    r2, r2, #5
  845.  
  846.         b    9f
  847.     
  848. L.4.1012:
  849.     @ remainder is negative
  850.     adds    r3, r3, lr
  851.         sub    r2, r2, #7
  852.         b    9f
  853.  
  854.     
  855.     
  856.     
  857. L.2.1014:
  858.     @ remainder is negative
  859.     adds    r3, r3, lr
  860.             @ depth 3, accumulated bits -3
  861.     mov    lr, lr, lsr #1
  862.     blt    L.3.1012
  863.     @ remainder is positive
  864.     subs    r3, r3, lr
  865.             @ depth 4, accumulated bits -5
  866.     mov    lr, lr, lsr #1
  867.     blt    L.4.1010
  868.     @ remainder is positive
  869.     subs    r3, r3, lr
  870.         sub    r2, r2, #9
  871.  
  872.         b    9f
  873.     
  874. L.4.1010:
  875.     @ remainder is negative
  876.     adds    r3, r3, lr
  877.         sub    r2, r2, #11
  878.         b    9f
  879.  
  880.     
  881.     
  882. L.3.1012:
  883.     @ remainder is negative
  884.     adds    r3, r3, lr
  885.             @ depth 4, accumulated bits -7
  886.     mov    lr, lr, lsr #1
  887.     blt    L.4.1008
  888.     @ remainder is positive
  889.     subs    r3, r3, lr
  890.         sub    r2, r2, #13
  891.  
  892.         b    9f
  893.     
  894. L.4.1008:
  895.     @ remainder is negative
  896.     adds    r3, r3, lr
  897.         sub    r2, r2, #15
  898.         b    9f
  899.  
  900.     
  901.     
  902.     
  903.     
  904.     9:
  905. Lend_regular_divide:
  906.     subs    ip, ip, #1
  907.     bge    Ldivloop
  908.     cmp    r3, #0
  909.     @ non-restoring fixup here (one instruction only!)
  910.     sublt    r2, r2, #1
  911.  
  912.  
  913. Lgot_result:
  914.     @ check to see if answer should be < 0
  915.     cmp    r6, #0
  916.     rsbmi r2, r2, #0
  917.  
  918.     mov r0, r2
  919.     ldmia    sp!, {r4, r5, r6, pc}
  920.  
  921. Ldiv_zero:
  922.     @ Divide by zero trap.  If it returns, return 0 (about as
  923.     @ wrong as possible, but that is what SunOS does...).
  924.     bl    ___div0
  925.     mov    r0, #0
  926.     ldmia    sp!, {r4, r5, r6, pc}
  927.  
  928. #endif /* L_divsi3 */
  929.  
  930. #ifdef L_umodsi3
  931.  
  932. ip    .req    r12
  933. sp    .req    r13
  934. lr    .req    r14
  935. pc    .req    r15
  936. .text
  937.     .globl ___umodsi3
  938.     .align 0
  939. ___umodsi3:
  940.     stmdb    sp!, {r4, r5, lr}
  941.     @ Ready to divide.  Compute size of quotient; scale comparand.
  942.     movs    lr, r1
  943.     mov    r3, r0
  944.     beq    Ldiv_zero
  945.  
  946.  
  947.     cmp    r3, lr            @ if r1 exceeds r0, done
  948.     mov    r2, #0
  949.     bcc    Lgot_result        @ (and algorithm fails otherwise)
  950.     mov    r4, #(1 << (32 - 4 - 1))
  951.     cmp    r3, r4
  952.     mov    ip, #0
  953.     bcc    Lnot_really_big
  954.  
  955.     @ Here the dividend is >= 2^(31-N) or so.  We must be careful here,
  956.     @ as our usual N-at-a-shot divide step will cause overflow and havoc.
  957.     @ The number of bits in the result here is N*ITER+SC, where SC <= N.
  958.     @ Compute ITER in an unorthodox manner: know we need to shift V into
  959.     @ the top decade: so do not even bother to compare to R.
  960.         mov    r5, #1
  961.     1:
  962.         cmp    lr, r4
  963.         bcs    3f
  964.         mov    lr, lr, lsl #4
  965.         add    ip, ip, #1
  966.         b    1b
  967.  
  968.     @ Now compute r5.
  969.     2:    adds    lr, lr, lr
  970.         add    r5, r5, #1
  971.         bcc    Lnot_too_big
  972.  
  973.         @ We get here if the r1 overflowed while shifting.
  974.         @ This means that r3 has the high-order bit set.
  975.         @ Restore lr and subtract from r3.
  976.         mov    r4, r4, lsl #4
  977.         mov    lr, lr, lsr #1
  978.         add    lr, r4, lr
  979.         sub    r5, r5, #1
  980.         b    Ldo_single_div
  981.  
  982.     Lnot_too_big:
  983.     3:    cmp    lr, r3
  984.         bcc    2b
  985. @        beq    Ldo_single_div
  986.  
  987.     /* NB: these are commented out in the V8-Sparc manual as well */
  988.     /* (I do not understand this) */
  989.     @ lr > r3: went too far: back up 1 step
  990.     @    srl    lr, 1, lr
  991.     @    dec    r5
  992.     @ do single-bit divide steps
  993.     @
  994.     @ We have to be careful here.  We know that r3 >= lr, so we can do the
  995.     @ first divide step without thinking.  BUT, the others are conditional,
  996.     @ and are only done if r3 >= 0.  Because both r3 and lr may have the high-
  997.     @ order bit set in the first step, just falling into the regular
  998.     @ division loop will mess up the first time around.
  999.     @ So we unroll slightly...
  1000.     Ldo_single_div:
  1001.         subs    r5, r5, #1
  1002.         blt    Lend_regular_divide
  1003.         sub    r3, r3, lr
  1004.         mov    r2, #1
  1005.         b    Lend_single_divloop
  1006.     Lsingle_divloop:
  1007.         cmp    r3, #0
  1008.         mov    r2, r2, lsl #1
  1009.         mov    lr, lr, lsr #1
  1010.         @ r3 >= 0
  1011.         subpl    r3, r3, lr
  1012.         addpl    r2, r2, #1
  1013.         @ r3 < 0
  1014.         addmi    r3, r3, lr
  1015.         submi    r2, r2, #1
  1016.     Lend_single_divloop:
  1017.         subs    r5, r5, #1
  1018.         bge    Lsingle_divloop
  1019.         b    Lend_regular_divide
  1020.  
  1021. 1:
  1022.     add    ip, ip, #1
  1023. Lnot_really_big:
  1024.     mov    lr, lr, lsl #4
  1025.     cmp    lr, r3
  1026.     bls    1b
  1027.     @
  1028.     @    HOW CAN ip EVER BE -1 HERE ?????
  1029.     @
  1030.     cmn    ip, #1
  1031.     beq    Lgot_result
  1032.  
  1033. Ldivloop:
  1034.     cmp    r3, #0    @ set up for initial iteration
  1035.     mov    r2, r2, lsl #4
  1036.         @ depth 1, accumulated bits 0
  1037.     mov    lr, lr, lsr #1
  1038.     blt    L.1.1015
  1039.     @ remainder is positive
  1040.     subs    r3, r3, lr
  1041.             @ depth 2, accumulated bits 1
  1042.     mov    lr, lr, lsr #1
  1043.     blt    L.2.1016
  1044.     @ remainder is positive
  1045.     subs    r3, r3, lr
  1046.             @ depth 3, accumulated bits 3
  1047.     mov    lr, lr, lsr #1
  1048.     blt    L.3.1018
  1049.     @ remainder is positive
  1050.     subs    r3, r3, lr
  1051.             @ depth 4, accumulated bits 7
  1052.     mov    lr, lr, lsr #1
  1053.     blt    L.4.1022
  1054.     @ remainder is positive
  1055.     subs    r3, r3, lr
  1056.         add    r2, r2, #15
  1057.  
  1058.         b    9f
  1059.     
  1060. L.4.1022:
  1061.     @ remainder is negative
  1062.     adds    r3, r3, lr
  1063.         add    r2, r2, #13
  1064.         b    9f
  1065.  
  1066.     
  1067.     
  1068. L.3.1018:
  1069.     @ remainder is negative
  1070.     adds    r3, r3, lr
  1071.             @ depth 4, accumulated bits 5
  1072.     mov    lr, lr, lsr #1
  1073.     blt    L.4.1020
  1074.     @ remainder is positive
  1075.     subs    r3, r3, lr
  1076.         add    r2, r2, #11
  1077.  
  1078.         b    9f
  1079.     
  1080. L.4.1020:
  1081.     @ remainder is negative
  1082.     adds    r3, r3, lr
  1083.         add    r2, r2, #9
  1084.         b    9f
  1085.  
  1086.     
  1087.     
  1088.     
  1089. L.2.1016:
  1090.     @ remainder is negative
  1091.     adds    r3, r3, lr
  1092.             @ depth 3, accumulated bits 1
  1093.     mov    lr, lr, lsr #1
  1094.     blt    L.3.1016
  1095.     @ remainder is positive
  1096.     subs    r3, r3, lr
  1097.             @ depth 4, accumulated bits 3
  1098.     mov    lr, lr, lsr #1
  1099.     blt    L.4.1018
  1100.     @ remainder is positive
  1101.     subs    r3, r3, lr
  1102.         add    r2, r2, #7
  1103.  
  1104.         b    9f
  1105.     
  1106. L.4.1018:
  1107.     @ remainder is negative
  1108.     adds    r3, r3, lr
  1109.         add    r2, r2, #5
  1110.         b    9f
  1111.  
  1112.     
  1113.     
  1114. L.3.1016:
  1115.     @ remainder is negative
  1116.     adds    r3, r3, lr
  1117.             @ depth 4, accumulated bits 1
  1118.     mov    lr, lr, lsr #1
  1119.     blt    L.4.1016
  1120.     @ remainder is positive
  1121.     subs    r3, r3, lr
  1122.         add    r2, r2, #3
  1123.  
  1124.         b    9f
  1125.     
  1126. L.4.1016:
  1127.     @ remainder is negative
  1128.     adds    r3, r3, lr
  1129.         add    r2, r2, #1
  1130.         b    9f
  1131.  
  1132.     
  1133.     
  1134.     
  1135.     
  1136. L.1.1015:
  1137.     @ remainder is negative
  1138.     adds    r3, r3, lr
  1139.             @ depth 2, accumulated bits -1
  1140.     mov    lr, lr, lsr #1
  1141.     blt    L.2.1014
  1142.     @ remainder is positive
  1143.     subs    r3, r3, lr
  1144.             @ depth 3, accumulated bits -1
  1145.     mov    lr, lr, lsr #1
  1146.     blt    L.3.1014
  1147.     @ remainder is positive
  1148.     subs    r3, r3, lr
  1149.             @ depth 4, accumulated bits -1
  1150.     mov    lr, lr, lsr #1
  1151.     blt    L.4.1014
  1152.     @ remainder is positive
  1153.     subs    r3, r3, lr
  1154.         sub    r2, r2, #1
  1155.  
  1156.         b    9f
  1157.     
  1158. L.4.1014:
  1159.     @ remainder is negative
  1160.     adds    r3, r3, lr
  1161.         sub    r2, r2, #3
  1162.         b    9f
  1163.  
  1164.     
  1165.     
  1166. L.3.1014:
  1167.     @ remainder is negative
  1168.     adds    r3, r3, lr
  1169.             @ depth 4, accumulated bits -3
  1170.     mov    lr, lr, lsr #1
  1171.     blt    L.4.1012
  1172.     @ remainder is positive
  1173.     subs    r3, r3, lr
  1174.         sub    r2, r2, #5
  1175.  
  1176.         b    9f
  1177.     
  1178. L.4.1012:
  1179.     @ remainder is negative
  1180.     adds    r3, r3, lr
  1181.         sub    r2, r2, #7
  1182.         b    9f
  1183.  
  1184.     
  1185.     
  1186.     
  1187. L.2.1014:
  1188.     @ remainder is negative
  1189.     adds    r3, r3, lr
  1190.             @ depth 3, accumulated bits -3
  1191.     mov    lr, lr, lsr #1
  1192.     blt    L.3.1012
  1193.     @ remainder is positive
  1194.     subs    r3, r3, lr
  1195.             @ depth 4, accumulated bits -5
  1196.     mov    lr, lr, lsr #1
  1197.     blt    L.4.1010
  1198.     @ remainder is positive
  1199.     subs    r3, r3, lr
  1200.         sub    r2, r2, #9
  1201.  
  1202.         b    9f
  1203.     
  1204. L.4.1010:
  1205.     @ remainder is negative
  1206.     adds    r3, r3, lr
  1207.         sub    r2, r2, #11
  1208.         b    9f
  1209.  
  1210.     
  1211.     
  1212. L.3.1012:
  1213.     @ remainder is negative
  1214.     adds    r3, r3, lr
  1215.             @ depth 4, accumulated bits -7
  1216.     mov    lr, lr, lsr #1
  1217.     blt    L.4.1008
  1218.     @ remainder is positive
  1219.     subs    r3, r3, lr
  1220.         sub    r2, r2, #13
  1221.  
  1222.         b    9f
  1223.     
  1224. L.4.1008:
  1225.     @ remainder is negative
  1226.     adds    r3, r3, lr
  1227.         sub    r2, r2, #15
  1228.         b    9f
  1229.  
  1230.     
  1231.     
  1232.     
  1233.     
  1234.     9:
  1235. Lend_regular_divide:
  1236.     subs    ip, ip, #1
  1237.     bge    Ldivloop
  1238.     cmp    r3, #0
  1239.     @ non-restoring fixup here (one instruction only!)
  1240.     addlt    r3, r1, r3
  1241.  
  1242.  
  1243. Lgot_result:
  1244.  
  1245.     mov r0, r3
  1246.     ldmia    sp!, {r4, r5, pc}
  1247.  
  1248. Ldiv_zero:
  1249.     @ Divide by zero trap.  If it returns, return 0 (about as
  1250.     @ wrong as possible, but that is what SunOS does...).
  1251.     bl    ___div0
  1252.     mov    r0, #0
  1253.     ldmia    sp!, {r4, r5, pc}
  1254.  
  1255. #endif /* L_umodsi3 */
  1256.  
  1257. #ifdef L_modsi3
  1258.  
  1259. ip    .req    r12
  1260. sp    .req    r13
  1261. lr    .req    r14
  1262. pc    .req    r15
  1263. .text
  1264.     .globl ___modsi3
  1265.     .align 0
  1266. ___modsi3:
  1267.     stmdb    sp!, {r4, r5, r6, lr}
  1268.     @ compute sign of result; if neither is negative, no problem
  1269.     eor    r6, r1, r0    @ compute sign
  1270.     cmp    r1, #0
  1271.     rsbmi    r1, r1, #0
  1272.     beq    Ldiv_zero
  1273.     mov    lr, r1
  1274.     movs    r3, r0
  1275.     rsbmi    r3, r3, #0    @ make dividend nonnegative
  1276.  
  1277.  
  1278.     cmp    r3, lr            @ if r1 exceeds r0, done
  1279.     mov    r2, #0
  1280.     bcc    Lgot_result        @ (and algorithm fails otherwise)
  1281.     mov    r4, #(1 << (32 - 4 - 1))
  1282.     cmp    r3, r4
  1283.     mov    ip, #0
  1284.     bcc    Lnot_really_big
  1285.  
  1286.     @ Here the dividend is >= 2^(31-N) or so.  We must be careful here,
  1287.     @ as our usual N-at-a-shot divide step will cause overflow and havoc.
  1288.     @ The number of bits in the result here is N*ITER+SC, where SC <= N.
  1289.     @ Compute ITER in an unorthodox manner: know we need to shift V into
  1290.     @ the top decade: so do not even bother to compare to R.
  1291.         mov    r5, #1
  1292.     1:
  1293.         cmp    lr, r4
  1294.         bcs    3f
  1295.         mov    lr, lr, lsl #4
  1296.         add    ip, ip, #1
  1297.         b    1b
  1298.  
  1299.     @ Now compute r5.
  1300.     2:    adds    lr, lr, lr
  1301.         add    r5, r5, #1
  1302.         bcc    Lnot_too_big
  1303.  
  1304.         @ We get here if the r1 overflowed while shifting.
  1305.         @ This means that r3 has the high-order bit set.
  1306.         @ Restore lr and subtract from r3.
  1307.         mov    r4, r4, lsl #4
  1308.         mov    lr, lr, lsr #1
  1309.         add    lr, r4, lr
  1310.         sub    r5, r5, #1
  1311.         b    Ldo_single_div
  1312.  
  1313.     Lnot_too_big:
  1314.     3:    cmp    lr, r3
  1315.         bcc    2b
  1316. @        beq    Ldo_single_div
  1317.  
  1318.     /* NB: these are commented out in the V8-Sparc manual as well */
  1319.     /* (I do not understand this) */
  1320.     @ lr > r3: went too far: back up 1 step
  1321.     @    srl    lr, 1, lr
  1322.     @    dec    r5
  1323.     @ do single-bit divide steps
  1324.     @
  1325.     @ We have to be careful here.  We know that r3 >= lr, so we can do the
  1326.     @ first divide step without thinking.  BUT, the others are conditional,
  1327.     @ and are only done if r3 >= 0.  Because both r3 and lr may have the high-
  1328.     @ order bit set in the first step, just falling into the regular
  1329.     @ division loop will mess up the first time around.
  1330.     @ So we unroll slightly...
  1331.     Ldo_single_div:
  1332.         subs    r5, r5, #1
  1333.         blt    Lend_regular_divide
  1334.         sub    r3, r3, lr
  1335.         mov    r2, #1
  1336.         b    Lend_single_divloop
  1337.     Lsingle_divloop:
  1338.         cmp    r3, #0
  1339.         mov    r2, r2, lsl #1
  1340.         mov    lr, lr, lsr #1
  1341.         @ r3 >= 0
  1342.         subpl    r3, r3, lr
  1343.         addpl    r2, r2, #1
  1344.         @ r3 < 0
  1345.         addmi    r3, r3, lr
  1346.         submi    r2, r2, #1
  1347.     Lend_single_divloop:
  1348.         subs    r5, r5, #1
  1349.         bge    Lsingle_divloop
  1350.         b    Lend_regular_divide
  1351.  
  1352. 1:
  1353.     add    ip, ip, #1
  1354. Lnot_really_big:
  1355.     mov    lr, lr, lsl #4
  1356.     cmp    lr, r3
  1357.     bls    1b
  1358.     @
  1359.     @    HOW CAN ip EVER BE -1 HERE ?????
  1360.     @
  1361.     cmn    ip, #1
  1362.     beq    Lgot_result
  1363.  
  1364. Ldivloop:
  1365.     cmp    r3, #0    @ set up for initial iteration
  1366.     mov    r2, r2, lsl #4
  1367.         @ depth 1, accumulated bits 0
  1368.     mov    lr, lr, lsr #1
  1369.     blt    L.1.1015
  1370.     @ remainder is positive
  1371.     subs    r3, r3, lr
  1372.             @ depth 2, accumulated bits 1
  1373.     mov    lr, lr, lsr #1
  1374.     blt    L.2.1016
  1375.     @ remainder is positive
  1376.     subs    r3, r3, lr
  1377.             @ depth 3, accumulated bits 3
  1378.     mov    lr, lr, lsr #1
  1379.     blt    L.3.1018
  1380.     @ remainder is positive
  1381.     subs    r3, r3, lr
  1382.             @ depth 4, accumulated bits 7
  1383.     mov    lr, lr, lsr #1
  1384.     blt    L.4.1022
  1385.     @ remainder is positive
  1386.     subs    r3, r3, lr
  1387.         add    r2, r2, #15
  1388.  
  1389.         b    9f
  1390.     
  1391. L.4.1022:
  1392.     @ remainder is negative
  1393.     adds    r3, r3, lr
  1394.         add    r2, r2, #13
  1395.         b    9f
  1396.  
  1397.     
  1398.     
  1399. L.3.1018:
  1400.     @ remainder is negative
  1401.     adds    r3, r3, lr
  1402.             @ depth 4, accumulated bits 5
  1403.     mov    lr, lr, lsr #1
  1404.     blt    L.4.1020
  1405.     @ remainder is positive
  1406.     subs    r3, r3, lr
  1407.         add    r2, r2, #11
  1408.  
  1409.         b    9f
  1410.     
  1411. L.4.1020:
  1412.     @ remainder is negative
  1413.     adds    r3, r3, lr
  1414.         add    r2, r2, #9
  1415.         b    9f
  1416.  
  1417.     
  1418.     
  1419.     
  1420. L.2.1016:
  1421.     @ remainder is negative
  1422.     adds    r3, r3, lr
  1423.             @ depth 3, accumulated bits 1
  1424.     mov    lr, lr, lsr #1
  1425.     blt    L.3.1016
  1426.     @ remainder is positive
  1427.     subs    r3, r3, lr
  1428.             @ depth 4, accumulated bits 3
  1429.     mov    lr, lr, lsr #1
  1430.     blt    L.4.1018
  1431.     @ remainder is positive
  1432.     subs    r3, r3, lr
  1433.         add    r2, r2, #7
  1434.  
  1435.         b    9f
  1436.     
  1437. L.4.1018:
  1438.     @ remainder is negative
  1439.     adds    r3, r3, lr
  1440.         add    r2, r2, #5
  1441.         b    9f
  1442.  
  1443.     
  1444.     
  1445. L.3.1016:
  1446.     @ remainder is negative
  1447.     adds    r3, r3, lr
  1448.             @ depth 4, accumulated bits 1
  1449.     mov    lr, lr, lsr #1
  1450.     blt    L.4.1016
  1451.     @ remainder is positive
  1452.     subs    r3, r3, lr
  1453.         add    r2, r2, #3
  1454.  
  1455.         b    9f
  1456.     
  1457. L.4.1016:
  1458.     @ remainder is negative
  1459.     adds    r3, r3, lr
  1460.         add    r2, r2, #1
  1461.         b    9f
  1462.  
  1463.     
  1464.     
  1465.     
  1466.     
  1467. L.1.1015:
  1468.     @ remainder is negative
  1469.     adds    r3, r3, lr
  1470.             @ depth 2, accumulated bits -1
  1471.     mov    lr, lr, lsr #1
  1472.     blt    L.2.1014
  1473.     @ remainder is positive
  1474.     subs    r3, r3, lr
  1475.             @ depth 3, accumulated bits -1
  1476.     mov    lr, lr, lsr #1
  1477.     blt    L.3.1014
  1478.     @ remainder is positive
  1479.     subs    r3, r3, lr
  1480.             @ depth 4, accumulated bits -1
  1481.     mov    lr, lr, lsr #1
  1482.     blt    L.4.1014
  1483.     @ remainder is positive
  1484.     subs    r3, r3, lr
  1485.         sub    r2, r2, #1
  1486.  
  1487.         b    9f
  1488.     
  1489. L.4.1014:
  1490.     @ remainder is negative
  1491.     adds    r3, r3, lr
  1492.         sub    r2, r2, #3
  1493.         b    9f
  1494.  
  1495.     
  1496.     
  1497. L.3.1014:
  1498.     @ remainder is negative
  1499.     adds    r3, r3, lr
  1500.             @ depth 4, accumulated bits -3
  1501.     mov    lr, lr, lsr #1
  1502.     blt    L.4.1012
  1503.     @ remainder is positive
  1504.     subs    r3, r3, lr
  1505.         sub    r2, r2, #5
  1506.  
  1507.         b    9f
  1508.     
  1509. L.4.1012:
  1510.     @ remainder is negative
  1511.     adds    r3, r3, lr
  1512.         sub    r2, r2, #7
  1513.         b    9f
  1514.  
  1515.     
  1516.     
  1517.     
  1518. L.2.1014:
  1519.     @ remainder is negative
  1520.     adds    r3, r3, lr
  1521.             @ depth 3, accumulated bits -3
  1522.     mov    lr, lr, lsr #1
  1523.     blt    L.3.1012
  1524.     @ remainder is positive
  1525.     subs    r3, r3, lr
  1526.             @ depth 4, accumulated bits -5
  1527.     mov    lr, lr, lsr #1
  1528.     blt    L.4.1010
  1529.     @ remainder is positive
  1530.     subs    r3, r3, lr
  1531.         sub    r2, r2, #9
  1532.  
  1533.         b    9f
  1534.     
  1535. L.4.1010:
  1536.     @ remainder is negative
  1537.     adds    r3, r3, lr
  1538.         sub    r2, r2, #11
  1539.         b    9f
  1540.  
  1541.     
  1542.     
  1543. L.3.1012:
  1544.     @ remainder is negative
  1545.     adds    r3, r3, lr
  1546.             @ depth 4, accumulated bits -7
  1547.     mov    lr, lr, lsr #1
  1548.     blt    L.4.1008
  1549.     @ remainder is positive
  1550.     subs    r3, r3, lr
  1551.         sub    r2, r2, #13
  1552.  
  1553.         b    9f
  1554.     
  1555. L.4.1008:
  1556.     @ remainder is negative
  1557.     adds    r3, r3, lr
  1558.         sub    r2, r2, #15
  1559.         b    9f
  1560.  
  1561.     
  1562.     
  1563.     
  1564.     
  1565.     9:
  1566. Lend_regular_divide:
  1567.     subs    ip, ip, #1
  1568.     bge    Ldivloop
  1569.     cmp    r3, #0
  1570.     @ non-restoring fixup here (one instruction only!)
  1571.     addlt    r3, r1, r3
  1572.  
  1573.  
  1574. Lgot_result:
  1575.     @ check to see if answer should be < 0
  1576.     cmp    r6, #0
  1577.     rsbmi r3, r3, #0
  1578.  
  1579.     mov r0, r3
  1580.     ldmia    sp!, {r4, r5, r6, pc}
  1581.  
  1582. Ldiv_zero:
  1583.     @ Divide by zero trap.  If it returns, return 0 (about as
  1584.     @ wrong as possible, but that is what SunOS does...).
  1585.     bl    ___div0
  1586.     mov    r0, #0
  1587.     ldmia    sp!, {r4, r5, r6, pc}
  1588.  
  1589. #endif /* L_modsi3 */
  1590.  
  1591. #ifdef L_divmodsi_tools
  1592.  
  1593.     .globl ___div0
  1594.     .align 0
  1595. ___div0:
  1596.     mov    pc, lr
  1597.  
  1598. #endif /* L_divmodsi_tools */
  1599.